キーの再生成 - Noise Protocol Framework (16)
万が一CipherStateのキーが漏洩したとしても古いメッセージを復元できないようにするために、一方向関数を利用して、CipherStateのキーを定期的に更新したい場合があります。
また、定期的なキーの再生成は、1つのキーで行われる暗号化のデータ量を削減することにも使用される可能性があります。AESGCMによる暗号化では単一のキーで暗号化されたデータ量が増えるに連れて、セキュリティが徐々に低下していくことが知られています。これを防ぐためにもキーの再生成が必要です。
Noiseプロトコルでは、キーの再生成をサポートするために、CipherState#Rekey()メソッドが用意されています。
キーの再生成を実行するか、またそのタイミングについてはアプリケーション次第です。たとえば、
アプリケーションが毎回、キーの再生成を行うこともできます。この場合、トランスポートメッセージが送受信されるたびにアプリケーションはキーを再生成します。これにより、古い暗号文を保護できますが、一方でキーの再生成が"高価"な場合は実装は難しいかもしれません。
アプリケーションは決められた回数のメッセージを送受信したあとで、自動的にキーを再生成することもできます。
アプリケーションは任意の基準に基づいてキーの再生成をすることもできます。その場合、何らかのメッセージを送信して、そのことを相手に通知する必要があるかもしれません。
アプリケーションは、キーの再生成の方法について独自に決定を下さなければいけません。キーの再生成の動作を指定するようなパターン修飾子はありません。
仕様上は、キーの再生成はCipherStateのk値のみを更新し、n値はリセットは必須ではありません。そのため、$ 2^{64}回以上のトランスポートメッセージを送信する場合は、新しいハンドシェイクを実行する必要があります。
例:
Lightning Networkでは1000回毎にキー(k)の再生成を行うように定められています。
同時にナンス(n)を0にリセットするようにしています。そのため、Lightning Networkでは$ 2^{64}回毎にハンドシェイクをやり直す必要はありません。
Noiseの仕様上は定められていませんが、ckの値もこの時にリセットしています。